package com.le.tester.imooc.masterJUC.threadlocal;

import com.le.tester.common.Const;

import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 描述：加锁来解决线程安全的问题
 */
public class ThreadLocalNormalUsage04 {

    private static final ExecutorService threadPool = Executors.newFixedThreadPool(10);
    //共用了一个对象，出现了数据的可见性问题，导致会转化到相同的时间
    private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Const.STANDARD_FORMAT);

    public static void main(String[] args) throws InterruptedException {
        Set<String> lists = new TreeSet<>();
        for (int i = 0; i < 1000; i++) {
            int finalI = i;
            threadPool.submit(new Runnable() {
                @Override
                public void run() {
                    String date = new ThreadLocalNormalUsage04().date(finalI);
                    System.out.println("threadPool string date:" + date);
                    lists.add(date);
                }
            });
        }
        //就像锁一样，还是得关闭线程池
        Thread.sleep(1000);
        threadPool.shutdown();
        if (threadPool.isShutdown()) {
            System.out.println("lists size is:" + lists.size());
        }
    }

    public String date(int seconds) {
        //字符串日期格式转换,参数的单位是毫秒，从1970.01.01 00:00:00 GTM开始计时
        Date date = new Date(1000 * seconds);
        //只新建一次即可
        //SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Const.STANDARD_FORMAT);
        String s = null;
        //同一个时刻只能有一个线程可以拿到这个锁，性能损耗严重
        //对当前的对象起作用（this表示当前的对象）可以类似于new ThreadLocalNormalUsage04()，可以知道锁住的只会是类中的部分
        //因为并没有拿这个this做什么操作。
        //synchronized (this);
        //对整个类起作用
        synchronized (ThreadLocalNormalUsage04.class) {
            s = simpleDateFormat.format(date);
        }
        return s;
    }
}
